import { AxiosPromise } from "axios";

/**
 * 通用分页请求函数，循环获取所有数据
 * @param fetchFunction 请求函数，如getMapEdges
 * @param params 请求参数，必须包含mapId，可选包含limit和page
 * @param resultKey 返回结果中数据项的键名，如'edges.items'
 * @returns 所有数据的Promise
 */
export async function fetchAllData<T, R>(
  fetchFunction: (params: T) => AxiosPromise<any>,
  params: T,
  resultKey: string
): Promise<R[]> {
  // 默认参数设置
  const defaultParams: any = {
    limit: 100, // 每页数据量
    page: 1, // 起始页码
    ...params,
  };

  let allData: R[] = [];
  let hasMoreData = true;
  let currentPage = defaultParams.page;

  try {
    while (hasMoreData) {
      // 更新当前页码
      const currentParams = {
        ...defaultParams,
        page: currentPage,
      };
      // 调用接口获取当前页数据
      const response = await fetchFunction(currentParams as T);
      // 根据resultKey获取数据项
      // 例如：如果resultKey是'edges.items'，则从response.edges.items获取数据
      const keys = resultKey.split(".");
      let result = response;
      for (const key of keys) {
        result = result[key];
      }
      // 如果没有数据或数据长度小于limit，说明已经获取完所有数据
      if (!result || !Array.isArray(result) || result.length === 0 || result.length < defaultParams.limit) {
        hasMoreData = false;
      }
      // 合并数据
      if (result && Array.isArray(result)) {
        allData = [...allData, ...result];
      }
      // 页码递增
      currentPage++;
    }

    return allData;
  } catch (error) {
    console.error("获取所有数据失败:", error);
    throw error;
  }
}

/**

 * @param getMapEdges 接口函数
 * @param mapId 地图ID
 * @returns 所有边数据的Promise
 */
export async function fetchAllMapEdges(
  getMapEdges: (params: { mapId: number; limit: number; page: number }) => AxiosPromise<any>,
  mapId: number,
  resultKey: string
) {
  const params = {
    mapId,
    limit: 100,
    page: 1,
  };
  return fetchAllData(getMapEdges, params, resultKey);
}
